package com.clei.netty.file.enums;

import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 文件上传相关命令类型枚举
 *
 * @author Y
 * @date 2022-04-21
 */
public enum FileSyncCmdTypeEnum {

    /**
     * 请求同步
     */
    REQ_SYNC("请求同步", (byte) 0),
    /**
     * 目录数据
     */
    REQ_FILE_DIRECTORY("目录数据", (byte) 1),
    /**
     * 文件数据
     */
    REQ_FILE_DATA("文件数据", (byte) 2),
    /**
     * 同步结束
     */
    REQ_FINISH("同步结束", (byte) 3),
    /**
     * 请求确认
     */
    RES_ACK("请求确认", (byte) 11),
    /**
     * 文件不存在
     */
    RES_FILE_NOT_EXISTS("文件不存在", (byte) 12);

    /**
     * cmdCode -> FileSyncCmdTypeEnum map
     */
    private static final Map<Byte, FileSyncCmdTypeEnum> CODE_MAP = Arrays.stream(FileSyncCmdTypeEnum.values())
            .collect(Collectors.toMap(FileSyncCmdTypeEnum::getCmdCode, e -> e));

    /**
     * name -> FileSyncCmdTypeEnum map
     */
    private static final Map<String, FileSyncCmdTypeEnum> NAME_MAP = Arrays.stream(FileSyncCmdTypeEnum.values())
            .collect(Collectors.toMap(FileSyncCmdTypeEnum::name, e -> e));

    /**
     * 命令名称
     */
    private final String cmdName;

    /**
     * 命令编码
     */
    private final Byte cmdCode;

    FileSyncCmdTypeEnum(String cmdName, Byte cmdCode) {
        this.cmdName = cmdName;
        this.cmdCode = cmdCode;
    }

    /**
     * 根据cmdCode获取枚举
     *
     * @param cmdCode 命令编码
     * @return FileSyncCmdTypeEnum
     */
    public static FileSyncCmdTypeEnum getByCmdCode(Byte cmdCode) {
        return null == cmdCode ? null : CODE_MAP.get(cmdCode);
    }

    /**
     * 根据name获取枚举
     *
     * @param name 枚举名称
     * @return FileSyncCmdTypeEnum
     */
    public static FileSyncCmdTypeEnum getByName(String name) {
        return null == name ? null : NAME_MAP.get(name);
    }

    public Byte getCmdCode() {
        return cmdCode;
    }

    public String getCmdName() {
        return cmdName;
    }
}

